package Form;

import java.util.HashMap;

import javax.servlet.http.HttpServletRequest;

import Creche.Donnees.Adresse;
import Creche.Personne.Personne;

public class AdresseForm {
	
	private static final String CHAMP_ADRESSE = "adresse";
    private static final String CHAMP_CP = "code_postal";
    private static final String CHAMP_VILLE = "ville";
    
    private Adresse adresse;
    
    /**
     * Constructeur de la class AdresseForm
     * @param requette de la servlet
     * @param map d'erreurs
     */
    public AdresseForm(HttpServletRequest req, HashMap<String,String> er, 
    		Personne pers) {
    	adresse = inscrireAdresse(req, er, pers);
	}
    
    
    /**
     * @return l'adresse complète saisie par l'utilisateur
     * avec ou sans erreurs
     */
    public Adresse getAdresse() {
    	return adresse;
    }
    
    
    /**
     * Inscrit une adresse après validation du formulaire 
     * @param requette de la servlet
     * @return adresse
     */
    public Adresse inscrireAdresse(HttpServletRequest req, 
    		HashMap<String,String> erreurs, Personne pers) {
    	
    	String adresse = req.getParameter(CHAMP_ADRESSE).trim();
    	String code_postal = req.getParameter(CHAMP_CP).trim();
    	String ville = req.getParameter(CHAMP_VILLE).trim();
    	
    	Adresse adr = new Adresse("adresse","ville");
    	adr.setKey(pers.getKey());
    	
	    /* Validation du champ adresse */
	    try {
	    	validationAdresse(adresse);
	        adr.setAdresse(adresse);
	    } catch (Exception e) {
	        setErreur(CHAMP_ADRESSE, e.getMessage(), erreurs);
	    }
	 
	    
	    /* Validation du champ code postal */
	    try {
	        validationCP(code_postal);
	        adr.setCP(code_postal);
	    } catch (Exception e) {
	        setErreur(CHAMP_CP, e.getMessage(), erreurs);
	    }
	 
	    
	    /* Validation du champ ville */
	    try {
	        validationVille(ville);
	        adr.setVille(ville);
	    } catch (Exception e) {
	        setErreur(CHAMP_VILLE, e.getMessage(), erreurs);
	    }
	    
	    return adr;
    }

    
    /**
     * Crée un message d'erreur si adresse invalide ou non saisie
     * @param adresse saisie par l'utilisateur
     */
    private void validationAdresse(String adresse) throws Exception {
    	if (!adresse.isEmpty()) {
    		if (!adresse.matches( "([0-9]+([a-z])?[,]?)?(\\s?[a-zA-Z])+" )) {
    			throw new Exception("Adresse invalide");
    		}
    	}
    	else {
    		throw new Exception("Veuillez saisir une adresse");
    	}
    }
    
    
    /**
     * Crée un message d'erreur si code postal invalide non saisi
     * @param code postal saisi par l'utilisateur
     */
    private void validationCP(String cp) throws Exception {
    	if (!cp.isEmpty()) {
    		if (!cp.matches( "[0-9]{5}" )) {
    			throw new Exception("Code postal invalide");
    		}
    	}
    	else {
    		throw new Exception("Veuillez saisir un code postal");
    	}
    }
    
    
    /**
     * Crée un message d'erreur si ville invalide ou non saisie
     * @param ville saisie par l'utilisateur
     */
    private void validationVille(String ville) throws Exception {
    	if (!ville.isEmpty()) {
    		if (!ville.matches( "([a-zA-Z][-]?)+" )) {
    			throw new Exception("Ville invalide");
    		}
    	}
    	else {
    		throw new Exception("Veuillez saisir une ville");
    	}
    }
    
    
    /**
     * Ajoute dans la map des erreurs le message correspondant au champ
     * @param champ du formulaire
     * @param message d'erreurs
     */
    private void setErreur(String champ, String message, 
    		HashMap<String,String> erreurs) {
    	
        erreurs.put(champ, message);
    }
}
